package 进阶阶段;

/**
 * 创建人：刘源江
 * 类描述：
 * 创建时间：2022/8/13 22:51
 **/

public class demo14进程与线程 {
    public static void main(String[] args) {//进入旧的栈内存
        //进程：进行中的程序
        //线程：进程中的一条执行路径，就可以做一个事情，那么多线程有多条执行路径，就可以做多个事情
        //并发：切换进行，单核CPU不断切换执行线程做事情
        //并行：同时进行，多核CPU在同时执行线程做事情

        //Thread类,线程类,所有线程相关的方法,都写在这个类里面!!!
            //Thread():分配一个新的线程对象。默认名字第一个子线程叫Thread-0,其他以此类推
            //start():导致此线程开始执行; Java虚拟机调用此线程的run方法。同一个线程对象不能多次调用start方法,否则会报非法线程状态异常:IllegalThreadStateException
            //getName():获取当前线程的名字
            //setName():设置当前线程的名字
            //run():此线程要执行的任务,在此处定义代码(写代码做事情)
            //sleep(long millis):使当前正在执行的线程以指定的毫秒数暂停（暂时停止执行）。//到达指定的时间再次运行代码
            //currentThread():返回当前正在执行的线程对象的引用,引用即Thread线程的对象名

        //方式一：new一个Thread对象
        Thread thread = new Thread();
        thread.start();//开辟了一个新的栈内存

        System.out.println(thread.getName());

        thread.setName("第一个线程");
        System.out.println(thread.getName());

        //方式二：重写Thread类的run方法来做事情，成为线程的儿子也是线程
        Son son = new Son();
        son.start();//开辟了一个新的栈内存，有了一个新的线程

        //方式三：重写run接口的run方法来做事情，接口子类对象通过有参构造给成员变量target赋值
        Gan gan = new Gan();
        Thread thread01 = new Thread(gan);
        thread01.start();//开辟一个新的栈内存，有了一个新的线程

        //方式四：匿名内部类重写run方法快速开启线程
        new Thread(){
            @Override
            public void run() {
                System.out.println("匿名内部类重写run()方法");
            }
        }.start();

        //方式五：
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名内部类new一个Runnable()方法");
            }
        }).start();

        //多线程：特点,随机性,单核cpu并发一会执行这个线程,一会执行另外一个线程,造成代码随机性的现象,可做多个事情
        //方式一、方式二、方式三就是一个多线程

        //实现Runnable接口比继承Thread类所具有的优势：
            //1. 适合多个相同的程序代码的线程去共享同一个资源。
            //2. 可以避免java中的单继承的局限性。
            //3. 增加程序的健壮性，实现解耦(耦合:类与类之间关系)操作，代码可以被多个线程共享，代码和线程独立。

    }
}

//方式二：重写Thread类的run方法来做事情，成为线程的儿子也是线程
class Son extends Thread{
    @Override
    public void run() {
        try {
            sleep(3000);//记时等待,3秒自动唤醒
            System.out.println("-----------------------------");
            System.out.println(Thread.currentThread().getName());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("继承Thread类重写run方法");
    }
}

//方式三：重写run接口的run方法来做事情，接口子类对象通过有参构造给成员变量target赋值
class Gan implements Runnable{
    @Override
    public void run() {
        System.out.println("实现接口Runnable类的run方法");
    }
}